import Vue from 'vue'

/**
 * 获取数据类型
 * @param value 判断数据
 * @returns  Number、String、Object、Array
 **/
Vue.prototype.getRawType = function (value) {
    return Object.prototype.toString.call(value).slice(8, -1)
}
/**
 * 判断对象为空
 * @param value 判断数据
 * @returns  Boolean
 **/
Vue.prototype.isObjectNull = function (value) {
    return Object.keys(value).length === 0
}
/**
 * UTC、时间戳格式转日期
 * @param: time 格式 UTC、时间戳
 * @return: （2018-01-12）、（2018年01月01日）或 （2018/01/01）
 */
Vue.prototype.getDateTime = (time, format = 'Y-m-d') => {
    if (time) {
        let date
        if (time.toString().length == 10) { // 时间戳格式
            date = new Date(time * 1000)
        } else { // UTC 格式
            date = new Date(Date.parse(time))
        }

        const Y = date.getFullYear()
        const M = (date.getMonth() + 1 < 10 ?
            '0' + (date.getMonth() + 1) :
            date.getMonth() + 1)

        const D = (date.getDate() < 10 ?
            '0' + date.getDate() :
            date.getDate())
        let h = date.getHours()
        let m = date.getMinutes()
        let s = date.getSeconds()
        if (s < 10) {
            s = '0' + s
        }
        if (m < 10) {
            m = '0' + m
        }
        if (h < 10) {
            h = '0' + h
        }

        if (format == 'Y-m-d') {
            return Y + '-' + M + '-' + D
        } else if (format == 'Y年m月d日') {
            return Y + '年' + M + '月' + D + '日'
        } else if (format == 'Y/m/d') {
            return Y + '/' + M + '/' + D
        } else if (format == 'Y.m.d') {
            return Y + '.' + M + '.' + D
        } else if (format == 'Y.m.d h:m:s') {
            return Y + '.' + M + '.' + D + ' ' + h + ':' + m + ':' + s
        } else if (format == 'Y-m-d h:m:s') {
            return Y + '-' + M + '-' + D + ' ' + h + ':' + m + ':' + s
        } else if (format == 'Y-m-d h:m') {
            return Y + '-' + M + '-' + D + ' ' + h + ':' + m
        } else if (format == 'Y年m月d日 h:m:s') {
            return Y + '年' + M + '月' + D + '日 ' + ' ' + h + ':' + m + ':' + s
        } else if (format == 'Y年m月d日 h:m') {
            return Y + '年' + M + '月' + D + '日 ' + ' ' + h + ':' + m
        } else if (format == 'Y/m/d h:m:s') {
            return Y + '/' + M + '/' + D + ' ' + h + ':' + m + ':' + s
        } else if (format == 'Y/m/d h:m') {
            return Y + '/' + M + '/' + D + ' ' + h + ':' + m
        }
    }
}

/**
 * 日期转时间戳
 * @param: time 格式 日期
 * @return: 时间戳
 */
Vue.prototype.getTimestamp = (time) => {
    if (time.indexOf('-') != -1) {
        time = time.replace(/-/g, '/')
    } else if (time.indexOf('年') != -1) {
        time = time.replace(/年|月/g, '/')
        time = time.replace(/日/g, '')
    } else {
        time = Date.parse(new Date())
    }
    const date = new Date(time)
    const timestamp = date.getTime() / 1000
    return timestamp
}

/**
 * 时间戳转 UTC
 * @param: str 格式 时间戳
 * @return: Wed Oct 17 2018 14:59:54 GMT+0800 (中国标准时间) UTC 格式时间
 */
Vue.prototype.getUTCTime = (str) => {
    if (typeof (str) !== 'string' || str.indexOf('-') != -1 || str.indexOf('/') != -1) {
        // console.log('请传入时间戳格式！')
        str = Date.parse(new Date()) / 1000
    }
    str = this.getDateTime(str)
    str = new Date(str)
    const utc = str.toUTCString()
    return utc
}
/**
 * 判断时间过去多久 
 * @param: time 格式 时间戳
 */
Vue.prototype.showTime = (time) => {
    let date =
        typeof time === "number" ?
            new Date(time) :
            new Date((time || "").replace(/-/g, "/"))

    let diff = (new Date().getTime() - date.getTime()) / 1000
    let dayDiff = Math.floor(diff / 86400)

    let isValidDate =
        Object.prototype.toString.call(date) === "[object Date]" &&
        !isNaN(date.getTime())

    if (!isValidDate) {
        window.console.error("不是有效日期格式")
    }
    const formatDate = function (date) {
        let today = new Date(date)
        let year = today.getFullYear()
        let month = ("0" + (today.getMonth() + 1)).slice(-2)
        let day = ("0" + today.getDate()).slice(-2)
        let hour = today.getHours()
        let minute = today.getMinutes()
        let second = today.getSeconds()
        return `${year}-${month}-${day} ${hour}:${minute}:${second}`
    }

    if (isNaN(dayDiff) || dayDiff < 0 || dayDiff >= 31) {
        return formatDate(date)
    }
    return (
        (dayDiff === 0 &&
            ((diff < 60 && "刚刚") ||
                (diff < 120 && "1分钟前") ||
                (diff < 3600 && Math.floor(diff / 60) + "分钟前") ||
                (diff < 7200 && "1小时前") ||
                (diff < 86400 && Math.floor(diff / 3600) + "小时前"))) ||
        (dayDiff === 1 && "昨天") ||
        (dayDiff < 7 && dayDiff + "天前") ||
        (dayDiff < 31 && Math.ceil(dayDiff / 7) + "周前")
    )
}

/**
 * 深度克隆
 * @param {*} obj 
 * @returns 
 */
Vue.prototype.deepClone = (obj) => {
    if (typeof obj !== "object" && typeof obj !== 'function') {
        return obj        //原始类型直接返回
    }
    var o = Vue.prototype.getRawType(obj) == "Array" ? [] : {}
    for (const i in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, i)) {
            o[i] = typeof obj[i] === "object" ? Vue.prototype.deepClone(obj[i]) : obj[i]
        }
    }
    return o
}

/**
 * base64转换成file
 * @param {String} dataurl 文件base64
 * @param {String} name 文件名
 * @return {File}
 */
Vue.prototype.dataURLtoBlob = (dataurl, name) => {
    //base64转file
    var arr = dataurl.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n)
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], name, {
        type: mime,
    })
}

/**
 * 获取链接携带的参数
 * @param {string} url
 * @returns {Object}
 */
Vue.prototype.getQueryObject = (url) => {
    url = url == null ? window.location.href : url
    const search = url.substring(url.lastIndexOf('?') + 1)
    const obj = {}
    const reg = /([^?&=]+)=([^?&=]*)/g
    search.replace(reg, (rs, $1, $2) => {
        const name = decodeURIComponent($1)
        let val = decodeURIComponent($2)
        val = String(val)
        obj[name] = val
        return rs
    })
    return obj
}
/**
 * 获取链接携带的参数
 * @param {string} url
 * @returns {Object}
 */
Vue.prototype.getUrlParams = (url) => {
    // 通过 ? 分割获取后面的参数字符串
    let urlStr = url.split('?')[1]
    // 创建空对象存储参数
    let obj = {}
    // 再通过 & 将每一个参数单独分割出来
    let paramsArr = urlStr.split('&')
    for (let i = 0, len = paramsArr.length; i < len; i++) {
        // 再通过 = 将每一个参数分割为 key:value 的形式
        let arr = paramsArr[i].split('=')
        obj[arr[0]] = arr[1]
    }
    return obj
}

/**
 * 富文本编辑器中拼接图片路由并设置图片样式
 * @param {string} url
 * @returns {String}
 */
Vue.prototype.dataHTML = (str) => {
    if (!str) return
    var BasicURL = Vue.prototype.richTextImg
    let url = str.replace(/\<img/gi, '<img style="max-width:100%;height:auto;object-fit: cover;"')
    //1，匹配出图片img标签（即匹配出所有图片），过滤其他不需要的字符
    //2.从匹配出来的结果（img标签中）循环匹配出图片地址（即src属性）

    var imgReg = /<img.*?(?:>|\/>)/gi//正则匹配图片（g表示匹配所有结果i表示区分大小写）

    var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i  //正则匹配src属性
    var arr = url.match(imgReg)
    if (!arr) return url
    for (var i = 0; i < arr.length; i++) {
        var src = arr[i].match(srcReg)
        //获取图片地址
        if (src[1]) {
            url = url.replace(src[1], BasicURL + src[1])
        }
    }

    return url
}

/**
 * 拼接图片地址
 * @param {string} url
 * @returns {String}
 */
Vue.prototype.montageImgUrl = (url, img = Vue.prototype.imgurl) => {
    return img + url
}

/**
 * 裁取图片
 * @param {string} str
 * @param {string} symbol 裁剪符号
 * @returns {Array}
 */
Vue.prototype.splitImg = (str, symbol = ",") => {
    if (!str) return
    return str.split(symbol)
}